#include <iostream>
#include <thread>
#include <future>
#include<chrono>
void ADD(int num1, int num2, std::promise<int> &prom)   // 进行异步的函数调用
{
    std::cout << "running the ADD func" << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(2));
    prom.set_value(num1 + num2);
}

// 思考：如果Add传输参数为(int num1, int num2. int &result)
// 也就是我们不需要promise，而是传入整型参数的地址，这样子不也是可以实现内部实现调用，外部获取数据吗？
// 答案是不行的，promise实现了同步机制，也就是进入ADD的新线程完成任务之后，外部才会获取的这个result
// 而如果是int &result我们无法保证，主线程和新线程哪一个先完成任务，也就是我们外部的result可能并没有运算完毕


int main()
{
    std::promise<int> prom;
    std::future<int> fu = prom.get_future();

    std::thread new_thread(ADD, 10, 20, std::ref(prom));
    int ret = fu.get(); // 这里通过.get获取异步处理函数结果，是一个同步，需要等待函数调用结束才继续主线程
    std::cout << "Add result = " << ret << std::endl;
    new_thread.join();
}